# 1. 创建LLM实例
import os

from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import Tool
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    model="qwen-turbo"
)

from langchain.tools import StructuredTool

# 工具1：查当前时间
def get_current_time():
    """返回当前的日期和时间（格式：年-月-日 时:分:秒）"""
    from datetime import datetime
    now = datetime.now()
    return now.strftime("%Y-%m-%d %H:%M:%S")

# 工具2：做加法计算（输入两个数字，返回和）
def add_two_numbers(num1: float, num2: float):
    """计算两个数字的和"""
    return num1 + num2

# 使用 StructuredTool 定义工具
tools = [
    StructuredTool.from_function(
        func=get_current_time,
        name="get_current_time",
        description="返回当前的日期和时间。当用户询问时间时调用此工具。不需要任何参数。",
        args_schema=None
    ),
    StructuredTool.from_function(
        func=add_two_numbers,
        name="add_two_numbers",
        description="计算两个数字的和。参数：num1（数字），num2（数字）。",
        args_schema=dict(num1=float, num2=float)
    )
]

# 定义Prompt模板（简化格式，明确工具调用逻辑）
prompt = ChatPromptTemplate.from_messages([
    ("system", """
    你是一个智能助手，可以使用以下工具完成任务：
    {tools}

    工具调用格式：
    <tool_call>
    {{
        "name": "工具名称",
        "parameters": {{
            "参数1": "值1",
            "参数2": "值2"
        }}
    }}
    </tool_call>
    """),
    ("user", "{input}"),
    ("assistant", "{agent_scratchpad}")
])

# 1. 创建Agent（OpenAI函数型Agent，适合我们定义的工具）
agent = create_openai_functions_agent(
    llm=llm,  # 传入大脑
    tools=tools,  # 传入工具
    prompt=prompt  # 传入决策Prompt
)

# 2. 创建Agent执行器（负责运行Agent的决策流程）
# verbose=True：显示详细的执行过程（方便我们调试，看Agent有没有正确调用工具）
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent,
    tools=tools,
    verbose=True
)

# 任务：“现在是什么时间？请告诉我。”
# result = agent_executor.run("现在是什么时间？请告诉我。")
# print("Agent的回答：", result)
# 添加调试日志
def get_current_time():
    from datetime import datetime
    now = datetime.now()
    current_time = now.strftime("%Y-%m-%d %H:%M:%S")
    print(f"[DEBUG] get_current_time called, returning: {current_time}")
    return current_time

# 确保代理配置正确
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent,
    tools=tools,
    verbose=True,
    handle_parsing_errors=True
)

# 调用代理
result = agent_executor.invoke({
    "input": "现在是什么时间？请告诉我。",
    "tools": tools,
    "agent_scratchpad": ""
})

# 调试输出
print("[DEBUG] Agent result:", result)
print("Agent的回答：", result.get("output", ""))

# 任务：“帮我计算一下 123.45 + 678.9 等于多少？”
# 调用代理
result = agent_executor.invoke({
    "input": "帮我计算一下 123.45 + 678.9 等于多少？",
    "tools": tools,
    "agent_scratchpad": ""
})
print("Agent的回答：", result)
